package com.leven.easyerp.dao;

import java.io.Serializable;
import java.util.List;

/**
 * 所有Dao接口的基类
 * 
 * @author Leven.Chen
 */
public interface BaseDao {
	/**
	 * 根据id获取对象
	 * 
	 * @param clazz
	 *            Entity class
	 * @param id
	 *            Entity id
	 * @return 如果对象不存在，则返回null
	 */
	<T> T get(Class<T> clazz, Serializable id);

	/**
	 * 创建对象
	 * 
	 * @param entity
	 *            待创建的对象
	 * @return Entity id
	 */
	<T> Serializable create(T entity);

	/**
	 * 修改对象
	 * 
	 * @param entity
	 *            待修改的对象
	 */
	<T> void update(T entity);

	/**
	 * 删除对象
	 * 
	 * @param entity
	 *            待删除的对象。该对象一定是get到的对象。
	 */
	<T> void delete(T entity);

	/**
	 * 根据id删除对象
	 * 
	 * @param clazz
	 *            Entity class
	 * @param id
	 *            Entity id
	 */
	<T> void deleteById(Class<T> clazz, Serializable id);

	/**
	 * 查询对象
	 * 
	 * @param hql
	 *            查询的hql语句
	 * @param args
	 *            参数列表
	 * @return
	 */
	<T> List<T> findObject(String hql, Object[] args);

	/**
	 * 查询对象
	 * 
	 * @param hql
	 *            查询的hql语句
	 * @param args
	 *            参数列表
	 * @param pageNo
	 *            页码
	 * @param pageSize
	 *            每页最大数量
	 * @return
	 */
	<T> List<T> findObject(final String hql, final Object[] args, int pageNo, int pageSize);

	/**
	 * 统计查询结果总数
	 * 
	 * @param hql
	 *            查询的hql语句（形如：select count(*) from User where sex=:sex）
	 * @param paramNames
	 *            参数名列表
	 * @param values
	 *            参数值
	 * @return
	 */
	int countObject(String hql, String[] paramNames, Object[] values);
}
